<?php
/**
 * @Author:      zwh
 * @DateTime:    2017-4-7 17:00:06
 * @Description: 活动包产品项
 */
class OrderProductAcItem extends Eloquent
{
    protected $table = "order_product_acitem";
    
    
    /**
     * @Author:      zwh
     * @DateTime:    修改
     * @Description: 用于修改基础产品的产品数量
     *  逻辑规则如下
     * 没有出库记录的  修改随意修改数量 null
     * 备货中 不能修改数量 需要领料 后在操作 0
     * 等待领料的  不能修改数量  需要领料 后在操作 1
     * 已经领料的  修改的数量  如果存在进行中的退库的不能修改数量  没有退库的 添加数量 的 生成新的 出库申请 如果 减少数量  退库成功 修改数量 2
     * 都是已经退货的 可以修改数量 3
     * 都是已经删除的 可以修改数量 4
     */
    public static function changeProductItemNum($order_product,$opaci_old,$opacp,$number,$amount,$sc_user_id){
        return DB::transaction(function () use ($order_product,$opaci_old,$opacp,$number,$amount,$sc_user_id) {
            $opaci=OrderProductAcItem::find($opaci_old->id);
            $temp_op_amount=$opaci->amount;
            $order=Orders::find($order_product->order_id);
            $moo=MaintenanceOutOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opaci->id)->whereIn("status",array(0,1))->first();
            if($moo){//如果存在 备货中或者 等待领料的 出库申请  不允许修改
                return Lang::get("scs_error.order_product_item_change_error_40012");
            }
            $mro=MaintenanceReturnOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opaci->id)->where("status",0)->first();
            if($mro){//如果 存在 正在退库的 不允许修改
                return Lang::get("scs_error.order_product_item_return_error_40013");
            }
            $temp_moo=MaintenanceOutOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opaci->id)->where("status",2)->first();
            $temp_num=$number-$opaci->num;
            if($temp_moo){//如果存在已经领料的   该种情况 如果是数量增加 添加新的 出库申请  如果是减少  判断 领料 和退库数量 的差值 进行修改
                if($opaci->item_type==1){//非标耗材的时候价格因素起作用
                    $max=0;
                    $ids=MaintenanceOutOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opaci->id)->where("status",2)->select("id")->get();
                    foreach ($ids as $_ids) {
                        $temp_max=DB::select("select max(tax_purchase_price) as max from  maintenance_out_item where number>return_numer and order_out_id=?",array($_ids->id));
                        $max=$max<$temp_max[0]->max?$temp_max[0]->max:$max;
                    }
                    if($amount < $max){
                        return Lang::get("scs_error.data_price_error_61018");
                    }
                    $opaci->amount=$amount;
                }
                
                if($temp_num>0){//如果是数量增加
                    if($opaci->item_type==1){//非标耗材的时候价格因素起作用
                        $max=MaintenanceStorageItem::where('item_id',$opaci->item_id)->where('shop_id',$order->shop_id)->where('type',1)->where('current_number','>',0)->where('status',1)->max('tax_purchase_price');
                        if($amount < $max){
                            return Lang::get("scs_error.data_price_error_61018");
                        }
                        $opaci->amount=$amount;
                    }
                    $new_moo=new MaintenanceOutOrder;
                    $new_moo->shop_id=$order->shop_id;
                    $new_moo->status=0;
                    $new_moo->type=$opaci->item_type;
                    $new_moo->item_id=$opaci->item_id;
                    $new_moo->product_type="activity";
                    $new_moo->product_item_id=$opaci->id;
                    $new_moo->order_id=$order->order_id;
                    $new_moo->number=$temp_num;
                    $new_moo->save();
                }else{///如果是数量减少 判断 出库数量 减去退库数量  如果 修改数量小于 出库数量减去退库数量 则 不允许修改  要退库在修改
                    $cro_num=MaintenanceReturnOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opaci->id)->where("status",1)->sum("number");//退库数量
                    $coo_num=MaintenanceOutOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opaci->id)->where("status",2)->sum("number");//出库数量
                    if($coo_num-$cro_num>$number){// 出库数量 -退库数量 大于等 修改树龄
                        return Lang::get("scs_error.order_product_item_change_error_40014");
                    }
                }
            }else{//如果不存在已经领料的  就是 该耗材项  没申请过领料 或者 是 申请领料 都已退货 都已删除 该种情况随意修改耗材数量
                if($opaci->item_type==1){//非标耗材的时候价格因素起作用
                    $max=MaintenanceStorageItem::where('item_id',$opaci->item_id)->where('shop_id',$order->shop_id)->where('type',1)->where('current_number','>',0)->where('status',1)->max('tax_purchase_price');
                    if($amount < $max){
                        return Lang::get("scs_error.data_price_error_61018");
                    }
                    $opaci->amount=$amount;
                }
            }
            $opr=new OrderProductRecord();
            $opr->order_id=$order->order_id;
            $opr->product_type='activity';
            $opr->operation_type='update';
            $opr->num=$opaci->num;
            $opr->operation_grade='二级';
            $opr->user_id=$sc_user_id;
            $opr->user_type='sc';
            $opr->operation_id=$opaci->id;
            $opr->name=$opaci->item_name;
            $opr->amount=$temp_op_amount;
            $opr->save();

            $opaci->num=$number;
            $opaci->save();

            //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
            Orders::calculate($order_product->order_id);

            Coupons::check_coupons($order_product->order_id);
            return array('code' => 0, 'msg' => 'ok', 'result' => array("order_id"=>$order_product->order_id));
        });
    }

    /**
     * @Author:      zwh
     * @DateTime:    2017-4-9 15:31:55
     * @Description: 用于更换耗材
     *  逻辑规则如下
     * 没有出库记录的  修改随意
     * 备货中 不能修改  或者出库退库 后在操作 0
     * 等待领料的  不能修改  需要领料全部退库 后在操作 1
     * 已经领料的  修改的数量  需要退库 在操作 2
     * 都是已经退货的 可以修改 3
     * 都是已经删除的 可以修改 4
     */
    public static function changeProductItem($order_product,$opi,$opacp,$si,$sc_user_id,$wmcf,$new_item_type,$csi){
        return DB::transaction(function () use ($order_product,$opi,$opacp,$si,$sc_user_id,$wmcf,$new_item_type,$csi) {
            $order=Orders::find($order_product->order_id);
            //判断出库条件
            $moo=MaintenanceOutOrder::where("product_type",$order_product->product_type)->where("product_item_id",$opi->id)->whereIn("status",array(0,1,2))->first();
            if($moo){//如果存在 备货中或者 等待领料的 出库申请 已经领料的 不允许修改
                return Lang::get("scs_error.order_product_item_change_error_40012");
            }
            //更换耗材的加价系数
            // $wpc=WorkPartsCoefficient::where("car_model_name",$csi->model_level)->where("supply_brand_id",$si->brand_id)->where("supply_subject_id",$si->subject)->where("status",1)->first();
            // if($wpc){
            //     $wmcf->supply_coefficient=$wpc->coefficient;
            // }else{
            //     $wmcf->supply_coefficient=1;
            // }
            

            if($new_item_type!=$opi->item_type||$opi->item_id!=$si->id){//说明更换了耗材 才进这些判断
                if($opi->item_type==0&&$opi->is_adapter==1){//说明原来 是标准耗材切 更换了耗材
                    OrderSmyFilling::where("order_id",$order->order_id)->where("product_item_id",$opi->id)->where("product_type","activity")->update(array("status"=>0));//取消原来的的耗材的添注记录
                }

                //判断特殊油品
                if($new_item_type==0){
                    if(in_array($si->id,Config::get("smy.item_id"))){//如果新耗材是特殊油品
                        OrderSmyFilling::saveosf($order->shop_id,$si->id,"activity",$opi->id,$order->order_id);
                    }
                }
            }
            
            $opr=new OrderProductRecord();
            $opr->order_id=$order->order_id;
            $opr->product_type='activity';
            $opr->operation_type='update';
            $opr->num=$opi->num;
            $opr->operation_grade='二级';
            $opr->user_id=$sc_user_id;
            $opr->user_type='sc';
            $opr->operation_id=$opi->id;
            $opr->name=$opi->item_name;
            $opr->amount=$opi->amount;
            $opr->save();

            $item_info=SupplyItem::getCacheItemInfo($si->id);
            // if($new_item_type==0){
                // $ss=SupplySeries::find($si->series_id);
                $opi->item_name=$item_info->name;
                $opi->amount=$si->amount;
                $opi->item_id=$si->id;
                $opi->unit=$item_info->unit?$item_info->unit:'';
            // }else{
            //     $opi->item_name=$si->series_name." ".$si->model;
            //     $opi->amount=$si->amount;
            //     $opi->item_id=$si->id;
            //     $opi->unit=$si->unit;
            // }
            $opi->item_type=$new_item_type;
            $opi->is_adapter=1;
            $opi->save();

            //订单应付金额及优惠信息将重新计算，废弃原有再优惠信息上加减
            Orders::calculate($order_product->order_id);
            Coupons::check_coupons($order_product->order_id);
            return array('code' => 0, 'msg' => 'ok', 'result' => array("order_id"=>$order_product->order_id));
        });
    }

}